package thread;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 当程序更新一个变量时，如果多线程同时更新这个变量，可能得到期望之外的值。
 * 比如变量 i = 1，A 线程更新 i+1，B 线程也更新i+1，经过两个线程操作之后可能 i 不等于 3，而是等于 2 。
 * 因为 A 和 B 线程在更新变量 i 的时候拿到的 i 都是 1，这就是 线程不安全的更新操作，通常我们会使用 synchronized 来解决这个问题，synchronized 会保证多线程不会同时更新变量 i。
 *
 * 而 Java 从 JDK 1.5 开始提供了 java.util.concurrent.atomic 包（以下简称Atomic包），这个包中的 原子操作类 提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。
 *
 * 作者：103style
 * 链接：https://www.jianshu.com/p/cb64f79058c2
 * 来源：简书
 */
public class AtomicTest {

    public static void main(String[] args) {
        AtomicInteger ai = new AtomicInteger(1);

        System.out.println("ai.get() = " + ai.get());

        System.out.println("ai.addAndGet(5) = " + ai.addAndGet(5));
        System.out.println("ai.get() = " + ai.get());

        System.out.println("ai.compareAndSet(ai.get(), 10) = " + ai.compareAndSet(ai.get(), 10));
        System.out.println("ai.get() = " + ai.get());

        System.out.println("ai.getAndIncrement() = " + ai.getAndIncrement());
        System.out.println("ai.get() = " + ai.get());

        ai.lazySet(8);
        System.out.println("ai.lazySet(8)");
        System.out.println("ai.get() = " + ai.get());

        System.out.println("ai.getAndSet(5) = " + ai.getAndSet(5));
        System.out.println("ai.get() = " + ai.get());
    }
}
